#include <stdio.h>
#include <stdlib.h>
#include "dict.h"
#include "key.h"
#include "bool.h"
#include "auxiliares.h"

#include <assert.h>



int main()
{
  
  dict dicc;
  char *file=NULL;
  char *pal=NULL;
  char *def=NULL;
  int opt=0;
  char *str1=NULL;
  char *str2=NULL;
  key palabra;
  data definicion;
  key palabra1;
  data definicion2;
    key palabra3;
   
  bool exit;
  
  
  system("clear");
  printf("                 .-\"\"-.\n");
  printf("                /      \\\n");
  printf("               /     (0 \\______\n");
  printf("               |         \"_____)\n");
  printf("               \\        ,-----' \n");
  printf("                \\_    _/\n");
  printf("                 /    \\\n");
  printf("                /      \\\n");
  printf("               /        \\\n");
  printf("              /          |\n");
  printf("             /        :  |\n");
  printf("            /     ;   :  |\n");
  printf("   \\\\\\     /  _.-'    :  |\n");
  printf("    \\\\\\\\  / _'        :  |\n");
  printf("     \\\\\\\\/ ;         :   /\n");
  printf("      \\\\  ;         :   /\n");
  printf("       \\   `._`-'_.'  _/\n");
  printf("        \\     ''' _.-' \n");
  printf("         \\      / /\n");
  printf("          \\    / /  \n");
  printf("           \\  /)(_______\n");
  printf("            )(_________< \n");
  printf("           (__________< \n");
  
  printf("\nTraido a Ustedes por: Jean-Pierre !\n");
  printf("\n\n####        Bienvenido a DiccioMatic-o 1.0        ####\n\n\n\n");
  printf("\nPresione 1 para cargar el Diccionario desde un archivo previo");
  printf("\nPresione 2 para salir\n");
  printf("\t--> ");
  /*verific(&opt);*/
  scanf("%i",&opt);
  while(opt<1 || opt>2)
    {
      printf("\nIngrese la opcion correcta\n");
      printf("\t--> ");
      verific(&opt);
    }
  
  switch (opt)
    {
    case 1:
      system("clear");
      printf("\nDiccionarios disponibles para usar: \n\n");
      system("ls|grep .dic");
      printf("\n\nIngrese la direccion del archivo de diccionario(path):");
      /*
      file=(char*)malloc(sizeof(char)*150);
      scanf("%s",file);*/
      file=cargar(250);
      dicc=dict_fromFile(file); /* Pasamos como parametro un char pointer*/
      
      printf("\n   +-------------------+\n");
      printf("   |DICCIONARIO CARGADO|");
      printf("\n   +-------------------+\n");
      free(file);
      break;
    
   
    case 2:
      /*palabra=key_destroy(palabra);
      palabra1=key_destroy(palabra1);
      definicion=data_destroy(definicion);
      definicion2=data_destroy(definicion2);*/
      
      return 0;

      
      break;
    }
  
  /* El diccionario fue cargado o creado*/
  
  exit=FALSE;
  while (exit==FALSE)
    {
      opt=0;
      printf("\n1-Agregar Una palabra al diccionario"); 
      printf("\n2-Buscar una palabra en el diccionario"); 
      printf("\n3-Eliminar una palabra del diccionario");
      printf("\n4-Modificar definicion de palabra");
      printf("\n5-Ver tamaño del diccionario");
      printf("\n6-Listar todas las palabras del diccionario");
      printf("\n7-Guardar el diccionario en el disco");
      printf("\n8-Salir y Guardar el diccionario en el disco");		
      printf("\n9-Salir sin guardar las modificaciones\n\n");
      printf("--> ");
      
      verific(&opt);
      
      
      while(opt<1 || opt>9)
	{
	  printf("\n\nOpcion mal ingresada\n");
	  printf("\nIngresar la opcion nuevamente--> ");
	  verific(&opt);
	}
      
      switch (opt)
	{	
	  
	  /* Agregar palabra al diccionario*/
	case 1: 
	  
	  printf("\n\nIngrese la palabra que desea agregar: ");
	  

	  pal=cargar(30);
	  
	  
	  /*Transforma el string "pal" en el key "palabra*/
	  palabra1 = key_empty();
	  
	  if(!key_copyStr(palabra1,pal))
	    printf("\n\nLa palabra no pudo ser ingresada");
	  else
	    {
	      str1=key_toStr(palabra1);
	      system("clear");
	      printf("\n--------------------------------------\n");
	      printf("La palabra a agregar es: %s", str1);
	      printf("\n--------------------------------------\n");
	      free(str1);
	      /* Verifica que la palabra no haya sido ingresada previamente*/
	      if (dict_exist(dicc,palabra1))
            printf("\n\nLa palabra que desea ingresar ya se encuentra en el diccionario\n\n");

	      else
			{
			  printf("\nIngrese definicion de la palabra: ");

			  def=cargar(150);
		  
			  definicion2 = data_empty();
		  
			  if(data_copyStr(definicion2,def))
			    {
		      /* Ingresa el diccionario los valores requeridos*/
		      
		      dicc = dict_add(dicc,palabra1,definicion2);
		      str1=key_toStr(palabra1);
		      str2=data_toStr(definicion2);
		      printf("\n---------------------------------\n");
		      printf("Palabra Agregada: %s \nDefinicion: %s",str1, str2);
		      printf("\n---------------------------------\n");
		      free(str1);
              str1=NULL;
		      free(str2);
              str2=NULL;
		      
		    }
		  else{
		    printf("\nNo pudo ingresarse la Palabra");
			}
		  free(def);
          def=NULL;
		  definicion2 = data_destroy(definicion2);
		}
	      
	    }
	  palabra1 = key_destroy(palabra1);
	  free(pal);
      pal=NULL;
	  break;
	  
	  /* Buscar una palabra en el diccionario*/
	case 2:
	  printf("\n\nIngrese la palabra que desea buscar: ");
		
	  /*
	  pal=(char*)malloc(sizeof(char)*30);
	  scanf("%s",pal);
	  */
	  pal=cargar(30);
	  palabra = key_empty();
	  if (key_copyStr(palabra,pal))
	    {
	      
	      if(dict_exist(dicc, palabra))
			{
		 	 definicion=dict_search(dicc, palabra);
		 	 str2=data_toStr(definicion);
		 	 system("clear");
		 	 printf("\n---------------------------\n");
		  	 printf("Palabra: %s \nDefinicion: %s",pal, str2);
		  	 printf("\n---------------------------\n");
		 	 free(str2);
		  	definicion=NULL;
		}
	      else
		{
		  system("clear");
		  printf("\nLa palabra buscada no existe\n\n");
		}
	      
	      
	    }
	  else
	    printf("\n\nNo se Pudo buscar la palabra");
	  
	  palabra=key_destroy(palabra);
	  free(pal);
	  break;
	  
	  
	  /*Eliminar una palabra del diccionario*/
	case 3:
	  
	  printf("\n\nIngrese la palabra que desea eliminar del diccionario: ");
	  
	  /*
	  pal=(char*)malloc(sizeof(char)*30);
	  scanf("%s",pal);*/
	  pal=cargar(30);
	  palabra= key_empty();
	  if (key_copyStr(palabra,pal))
	    {
	      if (dict_exist(dicc, palabra))
			{
		  		dicc=dict_del(dicc, palabra);
		  		system("clear");
		  		printf("\n----------------------------------\n");
		  		printf("PALABRA ELIMINADA: %s",pal);
		  		printf("\n----------------------------------\n");
		  
			}
	    
	 		else
				{
				  system("clear");
				  printf("\n\nLa palabra a eliminar no esta en el diccionario\n\n");

				}
	      
	    }
	  else
	    {
			printf("\nLa palabra no puede ser eliminada\n");
		 }
      palabra=key_destroy(palabra);
	  free(pal);
      pal=NULL;
	  break;
	  
	  /*Modificar definicion de palabra*/
	case 4:
	  
	  printf("\n\nIngrese la palabra cuya definicion desea modificar: ");
	  /*
	  pal=(char*)malloc(sizeof(char)*30);
	  scanf("%s",pal);*/
	  pal=cargar(30);
	  palabra1=key_empty();

	  if(key_copyStr(palabra1,pal))
	    {
	      
	      if(dict_exist(dicc, palabra1))
			{
		  		system("clear");
		  		str2=data_toStr(dict_search(dicc,palabra1));
		  		printf("\n--------------------------------------------\n");
		  		printf("Definicion actual: %s",str2);
		  		printf("\n--------------------------------------------\n");
		  		printf("\nIngrese la nueva definicion: ");
		  /*
		  def=(char*)malloc(sizeof(char)*150);
		  scanf("%s",def);*/
		  		def=cargar(150);
		  		definicion2=data_empty();

		  		if(data_copyStr(definicion2,def))
		  		  {
		  		    palabra3=key_clone(palabra1);
		  		    dicc=dict_del(dicc, palabra1);
		  		    dicc=dict_add(dicc, palabra3, definicion2);
		  		    system("clear");
		  		    printf("\n------------------------------------------\n");
		  		    printf("Palabra: %s \nNueva definicion: %s",pal, def);
		  		    printf("\n------------------------------------------\n");
		      	
                    palabra3=key_destroy(palabra3);
		  		  }
		  		else
		  		  		{
							printf("\n\nNo se pudo modificar la definicion de la palabra\n");
						}
                definicion2=data_destroy(definicion2);
                free(str2);
                str2=NULL;
				free(def);
                def=NULL;
		}
	   else
		{
		  system("clear");
		  printf("\n-----------------------------------------------\n");
		  printf("La palabra cuya definicion desea \nmodificar no esta en el diccionario");
		  printf("\n-----------------------------------------------\n");
		}
	      
	  }
	  else
	      printf("\n\nNo se pudo modificar la definicion de la palabra");

      palabra1=key_destroy(palabra1);
	  free(pal);
	  break;
	  
	  /*Ver tamaño del diccionario*/
	case 5:
	  system("clear");
	  printf("\n-----------------------------------------\n");
	  printf("El tamaño del diccionario es: %i palabras", dict_length(dicc));
	  printf("\n-----------------------------------------\n");
	  break;
	  
	case 6:
	  /*listado(dicc);*/
	  break;
	  
	  /*Guardar el archivo en el disco*/
	case 7:
	  
	  printf("\n\nIngrese el nombre con el que desea guardar el archivo: ");
	  /*
	  file=(char*)malloc(sizeof(char)*150);
	  scanf("%s",file);*/
	  
	  file=cargar(250);
	  if (dict_toFile(file,dicc))
	    {
	      system("clear");
	      printf("\n-----------------------------------------------------\n");
	      printf("El diccionario se ha guardado correctamente en disco.");
	      printf("\n-----------------------------------------------------\n");
	    }
	  else
	    printf("\a\tOoops!! No se ha podido guardar el archivo\n");
	  
	  free(file);
	  break;
	  
	  /* Guardar el archivo y salir de la aplicacion*/
	case 8:
	  
	  printf("\n\nIngrese el nombre con el que desea guardar el archivo: ");
	  /*
	  file=(char*)malloc(sizeof(char)*150);
	  scanf("%s",file);*/
	  file=cargar(250);
	  
	  if (dict_toFile(file,dicc))
	    {
	      system("clear");
	      printf("\n-----------------------------------------------------\n");
	      printf("El diccionario se ha guardado correctamente en disco.");
	      printf("\n-----------------------------------------------------\n");
	      
	      
	      /*	      free(file);*/
	      /*	      free(str1);
			      free(str2);*/
	      exit=TRUE;
	      /*	      free(palabra);
			      free(definicion);*/
	      /*	      palabra1=key_destroy(palabra1);
			      definicion2=data_destroy(definicion2);*/
	      dicc = dict_destroy(dicc);
	      
	    }
	  else
	    {
	      system("clear");
	      printf("\n----------------------------------------------------------\n");
	      printf("No se ha podido guardar el archivo, no se sale del programa");
	      printf("\n----------------------------------------------------------\n");
	    }
	  
	  free(file);
	  
	  
	  break;
	  
	case 9:
	  system("clear");
	  dicc = dict_destroy(dicc);
	  /*palabra->d=NULL;
	    free(palabra);
	  */
  	  exit=TRUE;
	  
	  break;
	}
    }
  printf("\n+--------------------------------------+\n");
  printf("|Gracias por utilizar DiccioMatic-o 1.0|");
  printf("\n+--------------------------------------+\n\n\n");
  return 0;
}


